package com.ljc;

import java.util.*;

/**
 * @author ljchen on 2022/1/18
 * 排序 + 鸽巢
 * 由题目给出的条件可知time_points的范围是[2,2*10^4]，而24小时所能组成的所有时间序列一共有1440种，所以超出1440的时间必有重复，直接返回0即可。
 *
 * 其余情况则需要对time_points进行处理，将其转为分钟形式存入到新数组，对新数组进行排序，取相邻两个之间的差的最小值。
 *
 * 这里需要注意的点就是类似[00:00, ... 23:59]这种，第一个值和最后一个值在结果上可能影响最终的返回，此时需要对加上一轮1440，再减去最后一个值，得到的差和上一步的最小值比较得出最终的最小值。
 */
public class M539MinimumTimeDifference {
    public static void main(String[] args) {
        List<String> timePoints = new ArrayList<String>(){{
            add("23:30");
            add("24:10");
            add("05:45");
            add("07:20");
        }};
        int minTime = findMinDifference(timePoints);
        System.out.println(minTime);

    }

    public static int findMinDifference(List<String> timePoints) {
        //一天24小时，每小时60分钟
        final int totalMinuteTime = 24 * 60;

        int n = timePoints.size();
        if (n > totalMinuteTime) {
            return 0;
        }
        //todo 用lambda表达式讲list<String>转化为int数组
//        int[] nums = timePoints.stream()
//                .mapToInt(MinimumTimeDifference::getMinutes).toArray();
//        Arrays.sort(nums);
//        System.out.println(Arrays.toString(nums));

        Collections.sort(timePoints);
        int ans = Integer.MAX_VALUE;
        int t0Minutes = getMinutes(timePoints.get(0));
        int preMinutes = t0Minutes;
        for (int i = 1; i < n; ++i) {
            int minutes = getMinutes(timePoints.get(i));
            // 相邻时间的时间差
            ans = Math.min(ans, minutes - preMinutes);
            preMinutes = minutes;
        }
        // 首尾时间的时间差
        ans = Math.min(ans, t0Minutes + totalMinuteTime - preMinutes);
        return ans;
    }

    public static int getMinutes(String t) {
        int h = Integer.parseInt(t.substring(0, 2));
        int m = Integer.parseInt(t.substring(3, 5));
        return h * 60 + m;
    }

}
